// Package main 是应用程序的入口点。
// 该文件包含主函数，负责初始化配置、启动 HTTP 服务器并处理优雅关闭。
package main

import (
	"context"
	"log"
	"net/http"
	"os"
	"os/signal"
	"time"

	"exchangeapp/config"
	"exchangeapp/router"
)

// main 是应用程序的入口函数。
// 它初始化配置、设置路由、启动 HTTP 服务器，并处理优雅关闭。
func main() {
	// 初始化应用配置。
	config.InitConfig()

	// 设置路由。
	r := router.SetupRouter()

	// 获取应用的端口号。
	port := config.AppConfig.App.Port
	if port == "" {
		port = ":8080" // 如果未配置端口，默认使用 8080。
	}

	// 创建 HTTP 服务器。
	srv := &http.Server{
		Addr:    port, // 监听的地址和端口。
		Handler: r,    // 使用配置好的路由引擎。
	}

	// 启动服务器。
	go func() {
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err) // 如果服务器启动失败，记录错误日志。
		}
	}()

	// 等待中断信号以优雅关闭服务器。
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt) // 监听操作系统的中断信号。
	<-quit
	log.Println("Shutdown Server ...")

	// 创建上下文，设置超时时间为 5 秒。
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	// 优雅关闭服务器。
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err) // 如果关闭失败，记录错误日志。
	}
	log.Println("Server exiting")
}
